package com.rsk.dao.utils;

import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.hibernate.SQLQuery;
import org.hibernate.query.internal.NativeQueryImpl;
import org.hibernate.transform.Transformers;
import org.springframework.stereotype.Component;

import com.rsk.utils.tools.PageUtils;


/**
 * @description: 查询工具类
 */

@SuppressWarnings("deprecation")
@Component
public class SearchDataUtils {

	
	@PersistenceContext
	private EntityManager entityManager;

	/**
    * 分页查询通用方法
    *
    * @param nowPage  当前页
    * @param pageSize 每页条数
    * @param sql      sql语句
    * @param paramMap  sql查询参数
    * @param clazz    返回类型
    * @param <T>
    * @return
    */
   @SuppressWarnings({ "unchecked"})
   public <T> PageUtils<T> searchByPage(Integer nowPage, Integer pageSize, String sql, String countSql, Map<String, Object> paramMap, Class<T> clazz) {
       // 初始化分页返回体
	   PageUtils<T> pageUtils = PageUtils.create(nowPage, pageSize);
       // 查询结果总条数
       int dataTotal = Integer.parseInt(getQueryWithParameters(entityManager.createNativeQuery(countSql), paramMap).getResultList().get(0).toString());
       pageUtils.setDataTotal(dataTotal);
       if (dataTotal == 0) return pageUtils;
       Query query = getQueryWithParameters(entityManager.createNativeQuery(sql), paramMap);
       // 忽略指定条数据，返回一页数据
       query.setFirstResult(pageUtils.getOffset()).setMaxResults(pageUtils.getPageSize());
       // 指定返回对象类型
       if(clazz==Map.class){
    	   query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
       }else{
    	   query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(clazz));
       }
       // 列表数据
       pageUtils.setList(query.getResultList());
       return pageUtils;
   }
   
   /* 查询通用方法
   *
   * @param sql      sql语句
   * @param maps     sql查询参数
   * @param clazz    返回类型
   * @param <T>
   * @return
   */
  @SuppressWarnings({ "unchecked", "rawtypes" })
  public <T> List<Map> search(String sql, Map<String, Object> paramMap, Class<T> clazz) {
      // 查询结果总条数
      Query query = getQueryWithParameters(entityManager.createNativeQuery(sql), paramMap);
      // 指定返回对象类型
      if(clazz==Map.class){
    	  query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
      }else{
    	  query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(clazz));
      }
      // 列表数据
      return query.getResultList();
  }

   /**
    * 设置查询所需的参数
    *
    * @param query
    * @param maps
    * @return
    */
   private Query getQueryWithParameters(Query query, Map<String, Object> maps) {
       if (maps.size() > 0) {
           for (String key : maps.keySet()) {
               query.setParameter(key, maps.get(key));
           }
       }
       return query;
   }


}
